// 导入状态码
import statusCode from './statusCode.js'
// 导入不同环境下的baseUrl
import {
	BASEURL
} from './config.js'

// 默认配置项
const defaultOptions = {
	method: 'GET',
	url: '',
	data: {},
	timeout: 5000,
	form: false,
}

function request(options) {
	// 对象的浅拷贝
	let _options = Object.assign(defaultOptions, options)
	// 参数的解构
	let {
		method,
		url,
		data,
		form,
		timeout
	} = _options
	// 设置请求头, 默认是空对象
	let header = {}
	// 如果采用默认的form, 是false, 请求头数据格式是json格式
	// 如果传参form: true, 请求头数据格式为表单数据
	if (form) {
		header = {
			'content-type': 'application/x-www-form-urlencoded'
		}
	} else {
		header = {
			'content-type': 'application/json'
		}
	}
	// url地址是否包含/my路径
	let isPay = url.indexOf('/my')
	// 能找到/my路径, 给请求头添加token
	if (isPay !== -1) {
		// header.Authorization = `Bearer ${store.state.m_user.token}`
	}
	return new Promise((resolve, reject) => {
		// 发请求前, 开请求加载的弹框
		uni.showLoading({
			title: '数据加载中...',
		})
		// 真正的发起请求
		uni.request({
			url: BASEURL + '/api/public/v1' + url, // 拼接url地址
			data, //请求的数据, 不传就是 {}
			header, //请求头, 分为表单数据, json数据, 如果有/my携带token
			method, //请求方式, 不传默认是GET
			timeout, //超时,默认5000
			success: (response) => { //成功
				let {
					data //类似于axios, data就是uni.request包装的一层数据
				} = response
				if (data.meta.status === statusCode.SUCCESS) {
					// 如果状态码是200, 把后台的message数据放到 .then() 内, 可以通过await拿到
					resolve(data.message)
				} else if (data.meta.status === statusCode.EXPIRE) {
					// 如果状态码是401, 清空本地的token
					uni.setStorageSync('token', '') // window.localStorage.setItem(key, value)
					// 跳转到登录页
					uni.navigateTo({
						url: '/login/login'
					})
					// 失败的消息进catach, 可以将来被 try{}catch(err){}捕获
					reject(data.meta.msg)
				} else if (data.meta.status === statusCode.NOT_FOUND) {
					// 如果状态码是404, 弹框告诉开发人员地址有误
					showToast('请求地址错误' + url)
					// 失败的消息进catach, 可以将来被 try{}catch(err){}捕获
					reject(data.meta.msg)
				} else {
					// 不是200, 401, 404, 走这里提示出错
					showToast(`请求错误${url}, CODE: ${code}`)
					reject(data.meta.msg)
				}
			},
			fail: (err) => {
				// 网络请求失败  断网了
				showToast(err.errMsg)
				reject(err)
			},
			complete() { // 无论成功, 失败都会走的函数 
				// 关闭加载的弹层
				uni.hideLoading()
			}
		})
	})
}

function showToast(title, icon = 'none', duration = 2500, mask = false) {
	uni.showToast({
		title: title || '',
		icon,
		duration,
		mask
	});
}

module.exports = request
